package ucla.encuestaMatic.controlador.servicios;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.record.IterationRecord;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.obelisco.modelo.dao.hibernate.CarpetaTransaccionDAO;
import com.obelisco.modelo.dao.hibernate.GrupoDAO;
import com.obelisco.modelo.dao.hibernate.SistemaDAO;
import com.obelisco.modelo.dao.hibernate.TipoDespliegueDAO;
import com.obelisco.modelo.dao.hibernate.TipoTransaccionDAO;
import com.obelisco.modelo.dao.hibernate.TransaccionDAO;
import com.obelisco.modelo.data.CarpetaTransaccion;
import com.obelisco.modelo.data.DataGenerica;
import com.obelisco.modelo.data.Grupo;
import com.obelisco.modelo.data.Sistema;
import com.obelisco.modelo.data.TipoDespliegue;
import com.obelisco.modelo.data.TipoTransaccion;
import com.obelisco.modelo.data.Transaccion;

import ucla.encuestaMatic.controlador.interfaces.IServicioAdministracionDefinicionEncuesta;
import ucla.encuestaMatic.modelo.dao.ServicioEncuestaDAO;
import ucla.encuestaMatic.modelo.dao.ServicioOpcionPreguntaDAO;
import ucla.encuestaMatic.modelo.dao.ServicioPreguntaDAO;
import ucla.encuestaMatic.modelo.data.Encuesta;
import ucla.encuestaMatic.modelo.data.OpcionPregunta;
import ucla.encuestaMatic.modelo.data.Pregunta;

public class ServicioAdministracionDefinicionEncuesta implements IServicioAdministracionDefinicionEncuesta {

	private ServicioEncuestaDAO servicioEncuestaDAO;
	private ServicioPreguntaDAO servicioPreguntaDAO;
	private ServicioOpcionPreguntaDAO servicioOpcionPreguntaDAO;
	private TransaccionDAO transaccionDAO;
	private SistemaDAO sistemaDAO;
	private CarpetaTransaccionDAO carpetaTransaccionDAO;
	private TipoTransaccionDAO tipoTransaccionDAO;
	private TipoDespliegueDAO tipoDespliegueDAO;
	private GrupoDAO grupoDAO;

	public List buscarEncuestas() {
		// TODO Auto-generated method stub
		List orden = new ArrayList();
		orden.add(Order.asc("nombre"));
		List lista = this.servicioEncuestaDAO.buscarTodos(DataGenerica.DATA_ACTIVO, orden);
		for (Iterator iter=lista.iterator(); iter.hasNext(); ) {
			Encuesta encuesta = (Encuesta)iter.next();
			encuesta.getPreguntas().size();
			for (Iterator iter2=encuesta.getPreguntas().iterator(); iter2.hasNext(); ) {
				Pregunta pregunta = (Pregunta)iter2.next();
				pregunta.getOpcionPreguntas().size();
			}
		}
		return lista;
	}

	public void eliminarEncuesta(Encuesta encuesta) {
		// TODO Auto-generated method stub
		this.servicioEncuestaDAO.eliminarLogicamente(encuesta, false);
	}
	
	private Sistema buscarSistema() {
		List sistemas = this.sistemaDAO.findAll(Sistema.class);
		if ((sistemas != null) && (sistemas.size() > 0))
			return (Sistema)sistemas.get(0);
		return null;
	}
	
	private CarpetaTransaccion buscarCarpetaTransaccionEncuestados() {
		List carpetasTransaccion = this.carpetaTransaccionDAO.findByProperty("nombre", "Encuestas");
		if ((carpetasTransaccion != null) && (carpetasTransaccion.size() > 0))
			return (CarpetaTransaccion)carpetasTransaccion.get(0);
		return null;
	}
	
	private TipoTransaccion buscarTipoTransaccionEcho2() {
		List tiposTransaccion = this.tipoTransaccionDAO.findByProperty("nombre", "Echo2");
		if ((tiposTransaccion != null) && (tiposTransaccion.size() > 0))
			return (TipoTransaccion)tiposTransaccion.get(0);
		return null;
	}
	
	private TipoDespliegue buscarTipoDespliegueVentana() {
		List tiposDespliegue = this.tipoDespliegueDAO.findByProperty("nombre", "Ventana");
		if ((tiposDespliegue != null) && (tiposDespliegue.size() > 0))
			return (TipoDespliegue)tiposDespliegue.get(0);
		return null;
	}
	
	private Grupo buscarGrupoEncuestados() {
		List criterios = new ArrayList();
		criterios.add(Restrictions.eq("id.sistema", this.buscarSistema()));
		criterios.add(Restrictions.eq("id.nombre", Grupo.GRUPO_ENCUESTADOS));
		List grupos = this.grupoDAO.findByCriterions(Grupo.class, criterios);
		if ((grupos != null) && (grupos.size() > 0))
			return (Grupo)grupos.get(0);
		return null;
	}

	private Transaccion buscarTransaccionPorEncuesta(Encuesta encuesta) {
		List transacciones = this.transaccionDAO.findByProperty("encuesta", encuesta);
		if ((transacciones != null) && (transacciones.size() > 0))
			return (Transaccion)transacciones.get(0);
		return null;
	}
	
	private void crearTransaccion(Encuesta encuesta) {
		Transaccion transaccion = this.buscarTransaccionPorEncuesta(encuesta);
		if (transaccion == null)
			transaccion = new Transaccion();
		transaccion.setSistema(this.buscarSistema());
		transaccion.setCarpeta(this.buscarCarpetaTransaccionEncuestados());
		transaccion.setNombre(encuesta.getNombre());
		transaccion.setDescripcion(encuesta.getDescripcion());
		transaccion.setSpring("trnAplicacionEncuesta");
		transaccion.setTipoTransaccion(this.buscarTipoTransaccionEcho2());
		transaccion.setTipoDespliegue(this.buscarTipoDespliegueVentana());
		//transaccion.setEncuesta(encuesta);
		transaccion.getGrupos().add(this.buscarGrupoEncuestados());
		this.transaccionDAO.saveOrUpdate(transaccion);
	}
	
	public void guardarEncuesta(Encuesta encuesta) {
		this.servicioEncuestaDAO.guardar(encuesta);
		this.crearTransaccion(encuesta);
	}
	
	public void validarPregunta(Pregunta pregunta) {
		this.servicioPreguntaDAO.validar(pregunta);
	}
	
	public void validarOpcionPregunta(OpcionPregunta opcionPregunta) {
		this.servicioOpcionPreguntaDAO.validar(opcionPregunta);
	}
	
	// Getter y Setter
	public ServicioEncuestaDAO getServicioEncuestaDAO() {
		return servicioEncuestaDAO;
	}

	public void setServicioEncuestaDAO(ServicioEncuestaDAO servicioEncuestaDAO) {
		this.servicioEncuestaDAO = servicioEncuestaDAO;
	}

	public ServicioPreguntaDAO getServicioPreguntaDAO() {
		return servicioPreguntaDAO;
	}

	public void setServicioPreguntaDAO(ServicioPreguntaDAO servicioPreguntaDAO) {
		this.servicioPreguntaDAO = servicioPreguntaDAO;
	}

	public ServicioOpcionPreguntaDAO getServicioOpcionPreguntaDAO() {
		return servicioOpcionPreguntaDAO;
	}

	public void setServicioOpcionPreguntaDAO(
			ServicioOpcionPreguntaDAO servicioOpcionPreguntaDAO) {
		this.servicioOpcionPreguntaDAO = servicioOpcionPreguntaDAO;
	}

	public TransaccionDAO getTransaccionDAO() {
		return transaccionDAO;
	}

	public void setTransaccionDAO(TransaccionDAO transaccionDAO) {
		this.transaccionDAO = transaccionDAO;
	}

	public SistemaDAO getSistemaDAO() {
		return sistemaDAO;
	}

	public void setSistemaDAO(SistemaDAO sistemaDAO) {
		this.sistemaDAO = sistemaDAO;
	}

	public CarpetaTransaccionDAO getCarpetaTransaccionDAO() {
		return carpetaTransaccionDAO;
	}

	public void setCarpetaTransaccionDAO(CarpetaTransaccionDAO carpetaTransaccionDAO) {
		this.carpetaTransaccionDAO = carpetaTransaccionDAO;
	}

	public TipoTransaccionDAO getTipoTransaccionDAO() {
		return tipoTransaccionDAO;
	}

	public void setTipoTransaccionDAO(TipoTransaccionDAO tipoTransaccionDAO) {
		this.tipoTransaccionDAO = tipoTransaccionDAO;
	}

	public TipoDespliegueDAO getTipoDespliegueDAO() {
		return tipoDespliegueDAO;
	}

	public void setTipoDespliegueDAO(TipoDespliegueDAO tipoDespliegueDAO) {
		this.tipoDespliegueDAO = tipoDespliegueDAO;
	}

	public GrupoDAO getGrupoDAO() {
		return grupoDAO;
	}

	public void setGrupoDAO(GrupoDAO grupoDAO) {
		this.grupoDAO = grupoDAO;
	}
	
}
